package com.ufcg.lvc.client.prototipacao;

import java.util.List;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.MultiWordSuggestOracle;
import com.google.gwt.user.client.ui.SuggestBox;
import com.google.gwt.user.client.ui.TextBox;
import com.smartgwt.client.util.BooleanCallback;
import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import com.ufcg.lvc.client.GreetingServiceCRUD;
import com.ufcg.lvc.client.GreetingServiceCRUDAsync;
import com.ufcg.lvc.client.UserData;
import com.ufcg.lvc.client.MyListGrids.AlunosListGrid;

public class MeusAlunos {

	MyPanelAlunos panelAlunos;
	AlunosListGrid listGrid;
	int instituicoesSize;
	SuggestBox suggestBox;
	UserData UD;
	
	public MeusAlunos(UserData uD) {
		UD = uD;
		final AsyncCallback<Boolean> callback = new AsyncCallback<Boolean>() {
			@Override
			public void onFailure(Throwable caught) {
				System.out.println("Erro na comunicação com o servidor");
			}

			@Override
			public void onSuccess(Boolean result) {
			}
		};

		final AsyncCallback<List<String>> callbackList = new AsyncCallback<List<String>>() {
			@Override
			public void onFailure(Throwable caught) {
				System.out.println("Erro na comunicação com o servidor");
			}

			@SuppressWarnings("deprecation")
			@Override
			public void onSuccess(List<String> result) {
				MultiWordSuggestOracle oracle = new MultiWordSuggestOracle();
		        for (int i = 0; i < result.size(); i++) {
					oracle.add(result.get(i).toString());
				}
		        suggestBox = new SuggestBox(oracle);
		        suggestBox.setAnimationEnabled(true);
		        suggestBox.setVisible(true);
		        suggestBox.setSize("319px", "17px");
		        panelAlunos.add(suggestBox, 143, 503);
			}
		};
		
		getServicoCRUD().getNomeIntituicoes(UD.getId_usuario(), callbackList);
		
		panelAlunos = new MyPanelAlunos("Meus alunos", "Novo aluno:");
		panelAlunos.setSize("900px", "707px");

	
		com.google.gwt.user.client.ui.Button btnAdicionarAluno = new com.google.gwt.user.client.ui.Button("Adicionar");
		panelAlunos.add(btnAdicionarAluno, 251, 538);
		btnAdicionarAluno.setSize("121px", "29px");

		listGrid = new AlunosListGrid(getServicoCRUD(), UD);
		panelAlunos.add(listGrid, 60, 69);
		
		final TextBox nomeTB = new TextBox();
		panelAlunos.add(nomeTB, 143, 433);
		nomeTB.setSize("319px", "17px");
		
//		com.google.gwt.user.client.ui.Button btnNotas = new com.google.gwt.user.client.ui.Button("Notas");
//		panelAlunos.add(btnNotas, 555, 342);
//		btnNotas.setSize("91px", "29px");
		
		Label lblNome = new Label("Nome:");
		panelAlunos.add(lblNome, 60, 433);
		
		Label lblMatrcula = new Label("Matrícula:");
		panelAlunos.add(lblMatrcula, 60, 468);
		lblMatrcula.setSize("47px", "17px");
		
		final TextBox matriculaTB = new TextBox();
		panelAlunos.add(matriculaTB, 143, 468);
		matriculaTB.setSize("319px", "17px");
		
		Label lblInstituicao = new Label("Instituição:");
		panelAlunos.add(lblInstituicao, 60, 503);
		lblInstituicao.setSize("47px", "17px");
        
		panelAlunos.getBtnExcluir().addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				try {
					if (listGrid.getSelectedRecord() != null) {
						SC.ask("Todas as provas e notas do aluno serão excluídos e o aluno será removido de todas as turmas que pertencer.\n\nDeseja deletar o aluno?", UD.getId_usuario(), new BooleanCallback() {  
		                    public void execute(Boolean value) {  
		                        if (value != null && value) {  
		                        	getServicoCRUD().deletarLinha("aluno", "nome", listGrid.getSelectedRecord().getAttribute("nome"), UD.getId_usuario(), callback);
		        					listGrid.loadDados(UD);  
		                        }  
		                    }  
		                });
					}else {
						Window.alert("Selecione o aluno que deseja excluir.");	
					}
				} catch (Exception e) {
					Window.alert("Selecione o aluno que deseja excluir.");
				}
		}});
		
		btnAdicionarAluno.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				if(!nomeTB.getText().trim().equals("") && !matriculaTB.getText().trim().equals("") && !suggestBox.getText().trim().equals("")){
								getServicoCRUD().salvarAlunos(nomeTB.getText(), matriculaTB.getText(), suggestBox.getText(), UD.getId_usuario(), new AsyncCallback<Boolean>() {
						@Override
						public void onFailure(Throwable caught) {
							System.out.println("Erro na comunicação com o servidor");
						}

						@Override
						public void onSuccess(Boolean result) {
							if (result == false){
								Window.alert("Este aluno já está cadastrado.");			
							}
							else {
								getServicoCRUD().getNomeIntituicoes(UD.getId_usuario(), callbackList);
								nomeTB.setText("");
								matriculaTB.setText("");
								listGrid.loadDados(UD);
//								MeusAlunos m = new MeusAlunos();
//								panelAlunos.clear();
//								panelAlunos.add(m.getPanel());
							}
						}
					});
					
					
				} else {
					Window.alert("Todos os campos devem ser preenchidos.");
				}
			}
		});
		
		panelAlunos.getBtnEditar().addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				try {
					ListGridRecord elem = listGrid.getSelectedRecord();
					EditarAluno m = new EditarAluno(elem.getAttribute("nome"),elem.getAttribute("matricula"),elem.getAttribute("instituicao"), UD);
					panelAlunos.clear();
					panelAlunos.add(m.getPanel());
				} catch (Exception e) {
					Window.alert("Selecione o aluno que deseja editar.");
				}
			}
		});
		
	}
	
	public static GreetingServiceCRUDAsync getServicoCRUD() {
		return GWT.create(GreetingServiceCRUD.class);
	}

	public AbsolutePanel getPanel() {
		return panelAlunos;
	}
}
